\section{std::utility}
包含
\begin{itemize}
    \item \href{https://zh.cppreference.com/w/cpp/header/compare}{<compare>(C++20)}： 三路比较运算符支持
    \item \href{https://zh.cppreference.com/w/cpp/header/initializer_list}{<initializer\_list>}(C++11)：std::initializer\_list 类模板
\end{itemize}
命名空间
\begin{itemize}
    \item \href{https://zh.cppreference.com/w/cpp/utility/rel_ops/operator_cmp}{rel\_ops}    提供自动的比较运算符。
        \cppfile{sample/utility_rel_op_demo.cc}
\end{itemize}
函数
\begin{itemize}
    \item \href{https://zh.cppreference.com/w/cpp/algorithm/swap}{swap}：交换两个对象的值(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/exchange}{exchange}(C++14)：将实参替换为一个新值，并返回其先前值(函数模板)
        \cppfile{sample/utility_exchange_demo.cc}
    \item \href{https://zh.cppreference.com/w/cpp/utility/forward}{forward}(C++11)：转发一个函数实参(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/move}{move}(C++11)：获得右值引用(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/move_if_noexcept}{move\_if\_noexcept}(C++11)：若移动构造函数不抛出则获得右值引用(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/as_const}{as\_const}(C++17)：获得到其实参的 const 引用(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/declval}{declval}(C++11)：获取到其实参的引用，用于不求值语境中(函数模板)
        \cppfile{sample/utility_declval_demo.cc}
    \item \href{https://zh.cppreference.com/w/cpp/utility/intcmp}{cmp\_equal}、cmp\_not\_equal、cmp\_less、cmp\_greater、cmp\_less\_equal、cmp\_greater\_equal(C++20)：比较二个整数值，而无转换所致的值更改(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/in_range}{in\_range}(C++20)：检查整数值是否在给定整数类型的范围内(函数模板)
        \cppfile{sample/utility_in_range_demo.cc}
    \item \href{https://zh.cppreference.com/w/cpp/utility/pair/make_pair}{make\_pair}：创建一个 pair 对象，其类型根据各实参类型定义(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/pair/operator_cmp}{operator<=>}(C++20):按字典序比较 pair 中的值(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/pair/swap2}{std::swap}(std::pair)(C++11)：特化 std::swap 算法(函数模板)
    \item \href{https://zh.cppreference.com/w/cpp/utility/pair/get}{std::get}(std::pair)(C++11)：访问 pair 的一个元素(函数模板)
\end{itemize}
类
\begin{itemize}
    \item \href{https://zh.cppreference.com/w/cpp/utility/pair}{pair}：实现二元组，即一对值(类模板)
        std::pair 是类模板，提供在一个单元存储两个相异类型对象的途径。 pair 是 std::tuple 的拥有两个元素的特殊情况。若 T1 与 T2 都不是可能有 cv 限定的拥有非平凡析构函数的类类型，或其数组，则 pair 的析构函数为平凡。
        \textbf{非成员函数}
        \begin{itemize}
\item make\_pair：创建一个 pair 对象，其类型根据各实参类型定义(函数模板)
\item operator==、operator!=、operator<、operator<=、operator>、operator>=（均在C++20 中移除）、operator<=>(C++20)按字典序比较 pair 中的值(函数模板)
\item \href{https://zh.cppreference.com/w/cpp/utility/pair/swap2}{std::swap(std::pair)}(C++11)特化 std::swap 算法(函数模板)
\item \href{https://zh.cppreference.com/w/cpp/utility/pair/get}{std::get(std::pair)}(C++11)访问 pair 的一个元素(函数模板)
        \end{itemize}
        \textbf{辅助类}
        \begin{itemize}
            \item \href{https://zh.cppreference.com/w/cpp/utility/pair/tuple_size}{std::tuple\_size<std::pair>}(C++11)：获得 pair 的大小(类模板特化)
            \item \href{https://zh.cppreference.com/w/cpp/utility/pair/tuple_element}{std::tuple\_element<std::pair>}(C++11)：获得 pair 中元素的类型(类模板特化)
            \item \href{https://zh.cppreference.com/w/cpp/utility/pair/basic_common_reference}{std::basic\_common\_reference<std::pair>}(C++23)确定二个 pair 的共同引用类型(类模板特化)
            \item \href{https://zh.cppreference.com/w/cpp/utility/pair/common_type}{std::common\_type<std::pair>}(C++23)确定二个 pair 的共同类型(类模板特化)
        \end{itemize}

    \item \href{https://zh.cppreference.com/w/cpp/utility/tuple_size}{tuple\_size}(C++11)：获得元组式类型的元素数(类模板)
        \begin{cpp}
template< class T >
struct tuple_size; // 不定义(1)    (C++11 起)
template< class T >
struct tuple_size< const T >
    : std::integral_constant<std::size_t, std::tuple_size<T>::value> { };//(2)    (C++11 起)
template< class T >
struct tuple_size< volatile T >
    : std::integral_constant<std::size_t, std::tuple_size<T>::value> { };//(3)    (C++11 起)
(C++20 中弃用)
template< class T >
struct tuple_size< const volatile T >
    : std::integral_constant<std::size_t, std::tuple_size<T>::value> { };//(4)    (C++11 起)(C++20 中弃用)
        \end{cpp}
        \begin{longlisting}
            \cppfile{sample/utility_tuple_size_demo.cc}
            \caption{tuple\_size使用示例}
            \label{code:tuple_size}
        \end{longlisting}
    \item \href{https://zh.cppreference.com/w/cpp/utility/tuple_element}{tuple\_element}(C++11)：获得元组式类型的元素类型(类模板)
        \begin{cpp}
template< std::size_t I, class T >
struct tuple_element; // 不定义(1)    (C++11 起)
template< std::size_t I, class T >
struct tuple_element< I, const T > {
    using type = typename
        std::add_const<typename std::tuple_element<I, T>::type>::type;
};// (2)    (C++11 起)
template< std::size_t I, class T >
struct tuple_element< I, volatile T > {
    using type = typename
        std::add_volatile<typename std::tuple_element<I, T>::type>::type;
};//(3)    (C++11 起)(C++20 中弃用)
template< std::size_t I, class T >
struct tuple_element< I, const volatile T > {
    using type = typename
        std::add_cv<typename std::tuple_element<I, T>::type>::type;
};
        \end{cpp}
        \begin{longlisting}
            \cppfile{sample/utility_tuple_element_demo.cc}
            \caption{std::tuple\_element使用示例}
            \label{code::tuple_elemen}
        \end{longlisting}

    \item \href{https://zh.cppreference.com/w/cpp/utility/pair/tuple_size}{std::tuple\_size<std::pair>}(C++11)：获得 pair 的大小(类模板特化)
    \item \href{https://zh.cppreference.com/w/cpp/utility/pair/tuple_element}{std::tuple\_element<std::pair>}(C++11)：获得 pair 中元素的类型(类模板特化)
    \item \href{https://zh.cppreference.com/w/cpp/utility/integer_sequence}{integer\_sequence}(C++14)：实现编译时整数数列(类模板)
        \begin{longlisting}
            \cppfile{sample/utility_index_sequence_demo.cc}
            \caption{std::index\_sequence}
            \label{code::index_sequence}
        \end{longlisting}
        输出：
        \begin{bash}
The sequence of size 7: 9 2 5 1 9 1 6
The sequence of size 20: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
The sequence of size 10: 0 1 2 3 4 5 6 7 8 9
The sequence of size 3: 0 1 2
(1, 2, 3, 4)
        \end{bash}
\end{itemize}
辅助项
\begin{itemize}
    \item \href{https://zh.cppreference.com/w/cpp/utility/piecewise_construct_t}{piecewise\_construct\_t}(C++11)：用于为逐段构造选择正确函数重载的标签类型(类)
    \item \href{https://zh.cppreference.com/w/cpp/utility/piecewise_construct}{piecewise\_construct}(C++11)：用于为逐段构造的函数消歧义的 piecewise\_construct\_t 类型的对象(常量)
    \item \href{https://zh.cppreference.com/w/cpp/utility/in_place}{in\_place}、in\_place\_type、in\_place\_index、in\_place\_t、in\_place\_type\_t、in\_place\_index\_t(C++17)：原位构造标签(类模板)
\end{itemize}
